package com.abl.core.mybatis.util;

import com.abl.core.common.security.AuthUser;
import com.abl.core.common.util.AuthKit;
import com.abl.core.common.util.IdKit;
import com.abl.core.common.util.ObjectKit;
import lombok.SneakyThrows;

import java.lang.reflect.Field;
import java.time.LocalDateTime;

public class DbKit {

    @SneakyThrows
    public static void fillInsert(Object tableEntity) {
        Class<?> clazz = tableEntity.getClass();
        Field idField = null;

        try {
            idField = clazz.getField("id");
        } catch (Exception ignored) {
        }

        if (idField != null) {
            idField.setAccessible(true);
            Object idFieldValue = idField.get(tableEntity);
            if (ObjectKit.isBlank(idFieldValue)) idField.set(tableEntity, IdKit.getId());
        }

        fillAT(tableEntity, "ca", "ct");

        fillAT(tableEntity, "ua", "ut");

    }

    @SneakyThrows
    public static void fillUpdate(Object tableEntity) {
        fillAT(tableEntity, "ua", "ut");
    }

    @SneakyThrows
    public static Object fillSet(Object o, String property, Object value) {
        //场景1：用于检测当前账户是否拥有该字段权限，
        //      有正常返回 value，没有权限返回 null


        //场景2：entity 中可能定义某个业务值
        //      当监听到某个字段被赋值了，这
        //      里可以主动去给另外的其他字段赋值


        //场景3：内容转换和二次加工，对 value 值进行修改后返回
        return value;
    }

    private static void fillAT(Object tableEntity, String aFieldStr, String tFieldStr) throws IllegalAccessException {
        Class<?> clazz = tableEntity.getClass();
        Field aField = null;
        Field tField = null;

        try {
            aField = clazz.getField(aFieldStr);
        } catch (Exception ignored) {
        }

        try {
            tField = clazz.getField(tFieldStr);
        } catch (Exception ignored) {
        }

        //0代表系统
        AuthUser currentUser = AuthKit.getCurrentUser();
        String userAccount = "0";
        if (currentUser != null) userAccount = currentUser.getAccount();


        if (aField != null) {
            aField.setAccessible(true);
            Object aFieldValue = aField.get(tableEntity);
            if (ObjectKit.isBlank(aFieldValue)) aField.set(tableEntity, userAccount);
        }

        if (tField != null) {
            tField.setAccessible(true);
            Object tFieldValue = tField.get(tableEntity);
            if (ObjectKit.isBlank(tFieldValue)) tField.set(tableEntity, LocalDateTime.now());
        }

    }
//
//    public static String getWhereSQL(String sql) {
//        //SELECT * FROM WHERE
//        return StringKit.subAfter(" WHERE ", sql);
//    }
//    /**
//     * 读取所有字段
//     * 自动排除空值
//     */
//    public static HashSet<?> columns_(Object o) {
//        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(o));
//
//        Set<String> keyColumns = jsonObject.keySet();
//
//        return keyColumns.stream().filter(keyColumn -> StringKit.isNotBlank(jsonObject.getString(keyColumn))).collect(Collectors.toCollection(HashSet::new));
//    }
//
//    /**
//     * 驼峰转下划线
//     */
//    public static String humpTo_(String str) {
//        if (StringKit.isBlank(str)) return "";
//        //截取下划线分成数组，
//        char[] charArray = str.toCharArray();
//        StringBuilder buffer = new StringBuilder();
//        //处理字符串
//        for (int i = 0, l = charArray.length; i < l; i++) {
//            if (charArray[i] >= 65 && charArray[i] <= 90) {
//                buffer.append("_").append(charArray[i] += 32);
//            } else {
//                buffer.append(charArray[i]);
//            }
//        }
//        String s = buffer.toString();
//        if (s.indexOf("_") == 0) return s.substring(1);
//        return s;
//    }
//
//    public static String keyIn(String key, Collection<?> tableColumnValues) {
//        StringBuilder stringBuilder = new StringBuilder();
//        ArrayList<?> objects = new ArrayList<>(tableColumnValues);
//        if (objects.size() == 1) {
//            stringBuilder.append("`").append(key).append("`").append(" = ").append("'").append(objects.get(0)).append("'");
//        } else {
//            stringBuilder.append("`").append(key).append("`").append(" in ").append(" ( ");
//            for (int i = 0; i < objects.size(); i++) {
//                Object o = objects.get(i);
//                if (i == objects.size() - 1) {
//                    stringBuilder.append("'").append(o).append("'");
//                } else {
//                    stringBuilder.append("'").append(o).append("'").append(",");
//                }
//            }
//            stringBuilder.append(" ) ");
//        }
//        return stringBuilder.toString();
//    }
//
//    public static Object blank(Object o) {
//        if (ObjectKit.isBlank(o)) {
//            return null;
//        }
//        return o;
//    }
//
//    public static void fillQuery(QueryWrapper queryWrapper, boolean isFillQuery) {
//        if (isFillQuery) {
//            String sql = queryWrapper.toSQL();
//            //            System.out.println(sql);
//
//            //当 ss 不存在时,并且 非 join 操作时，追加默认查询未删除数据
//            if (!sql.contains("`ss`") && !sql.contains("join ") && !sql.contains("JOIN ")) {
//                queryWrapper.where(" `ss` = '0' ");
//            }
//            //            sql = queryWrapper.toSQL();
//            //            System.out.println(sql);
//        }
//    }
//    private static ZBMapper baseMapper;
//
//    public static ZBMapper baseMapper() {
//        if (baseMapper != null) return baseMapper;
//        baseMapper = ContextKit.getBean(ZBMapper.class);
//        return baseMapper;
//    }

//    public static ArrayList<Map<String, Object>> toCamelCase(List<Row> list) {
//        ArrayList<Map<String, Object>> rows = new ArrayList<>(list.size());
//        for (Row row : list) {
//            Map<String, Object> camelKeysMap = row.toCamelKeysMap();
//            rows.add(camelKeysMap);
//        }
//        return rows;
//    }
}
